package com.woniuxy.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author: mayuhang  <br/>
 * Date: 2021/4/22:23:41  <br/>
 * Description: 工具类 生成JWT 和
 */
@Component
public class JWTUtil {
    //过期时间5分钟
//    private static final long EXPIRE_TIME = 5*60*1000;
    /**
     * Description : 校验token是否正确,错了就直接异常了 所以就直接返回true即可  <br/>
     * ChangeLog : 1. 创建 (2021/5/3 21:58 [mayuhang]);
     * @param token 密钥
     *        username 用户名
     *        secret 用户的密码  用于加密 作为解密条件 类似之前jwt教学中的signWith
     *              //签名算法 以及签的名字
     *             .signWith(SignatureAlgorithm.HS256, "woniuxy");
     * @return 是否正确
     **/
    public static boolean verify(String token,String username,String secret){
        //这里需要和生成签名的签名算法保持一致~
        Algorithm algorithm = Algorithm.HMAC256(secret);
        JWTVerifier verifier =
                JWT.require(algorithm).withClaim("username", username).build();
        verifier.verify(token);
        //直接通过用户名 去缓存redis中 找token 然后进行比对
        return true;
    }
    /**
     * Description : 获得token中的信息无需secret解密也能获得  <br/>
     * ChangeLog : 1. 创建 (2021/5/3 22:01 [mayuhang]);
     * @param token
     * @return token中包含的用户名
     **/
    public static String getUserName(String token){
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("username").asString();
    }
    /**
     * Description : 生成签名,5min后过期  <br/>
     * ChangeLog : 1. 创建 (2021/5/3 22:01 [mayuhang]);
     * @param username 用户名
     * @param secret 用户的密码
     * @return 加密的token
     **/

    public static String sign(String username,String secret){
        Date date = new Date(System.currentTimeMillis());
        Algorithm algorithm = Algorithm.HMAC256(secret);
        String token = JWT.create()
                .withClaim("username", username)
//                .withExpiresAt(date) //过期时间
                .withIssuedAt(date)   //创建时间
                .sign(algorithm);
        return token;
    }
}
